home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
User's Choice Windows CD
/
User's Choice Windows CD (CMS Software)(1993).iso
/
win_m_p
/
pwez51.zip
/
SCRLRAND.BAS
< prev
next >
Wrap
BASIC Source File
|
1992-04-01
|
16KB
|
343 lines
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'!!! ** [ READ THIS ] ** !!!!!!!! ** [ READ THIS ] ** !!!
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' DATA FILE, RANDDATA.DAT REQUIRED FOR THIS PROGRAM -- SEE SCRLFILE.DOC
'***************************************************************************
'** THIS PROGRAM MUST BE USED WITH ONE OF THE FOLLOWING LIBRARIES: **
'***************************************************************************
'** For QB4.+ unenhanced version use QB4UNEN.QLB **
'** For BASIC 7.+ unenhanced version use PDSUNEN.QLB **
'** For QB4.50 enhanced version use QBALL45.QLB or QBNER45.QLB **
'** For QB4.00/4.00b enhanced version use QBALL40.QLB or QBNER40.QLB **
'** For BASIC 7.0 enhanced version use PDSALL70.QLB or PDSNER70.QLB **
'** For BASIC 7.1 enhanced version use PDSALL71.QLB or PDSNER71.QLB **
'** Load QB or QBX with the /L option using the correct library **
'***************************************************************************
' INSTRUCTIONS
' ------------
' 1. MAKE SURE THE DATA FILE, RANDDATA.DAT, IS IN THE CURRENT
' DRIVE/DIRECTORY. IF THE DATA FILE IS NOT AVAILABLE IT MAY BE
' MADE USING MAKERAND.BAS ( SEE SCRLFILE.DOC ).
' 2. LOAD QUICKBASIC OR PDS WITH THE CORRECT LIBRARY. ( SEE ABOVE )
' 3. LOAD SCRLRAND.BAS ( THIS PROGRAM ) INTO QB OR QBX.
' 4. RUN THE PROGRAM. ( SHIFT F5 )
'
' **** SEE SCRLFILE.DOC FOR ADDITIONAL INFORMATION ****
'***************************************************************************
COLOR 0, 7: CLS
CALL SETWIND(1, 1, 0) ' INITIALIZE WINDOW MEMORY.
CALL INPTINIT(1, 1, "") ' INITIALIZE INPUT MEMORY.
CALL SETSCRL(1, 0, 15) ' HI-INTENSITY TAG CHARACTER.
DO
ANS$ = ""
CALL GETANS("Color or Mono (C/M) ?", "CM", ANS$, 100, 100, 143, 11)
IF ANS$ = "C" THEN COL% = 23 ELSE COL% = 112
LOOP WHILE ANS$ = CHR$(27)
IF COL% = 23 THEN A% = 31 ELSE A% = 15
CALL INFOLINE(25, 1, 80, A%) ' TURN INFO-LINE ON.
CALL MOUSEON(1) ' TURN THE MOUSE ON.
CALL MBUTTONS(13, 27) ' RIGHT MOUSE BUTTON = ENTER
' LEFT MOUSE BUTTON = ESC
'---------------------------------------------------------------------------
' DESCRIPTION WINDOW
CALL MAKEWIND(2, "@Virtual scroll window template - Using random file access", 2, 100, 74, 8, COL%, 111)
CALL PRINTW("This scroll window scrolls through a random access file. It holds 7", 1, 2)
CALL PRINTW("records at a time. This eliminates the need to place the entire file", 2, 2)
CALL PRINTW("in memory, minimizing precious string space usage. This template may", 3, 2)
CALL PRINTW("be used with binary or indexed files with slight modification.", 4, 2)
'---------------------------------------------------------------------------
' MAKE THE WINDOW TO BE USED AS THE SCROLL WINDOW.
' INITIALIZE VARIABLES
CALL MAKEWIND(1, "", 12, 100, 74, 11, COL%, 111) ' WINDOW WITH 11 ROWS
FILEPOINTER = 1 ' START AT RECORD# 1.
RTRN% = 1 ' SCROLL BAR OVER 1ST ENTRY.
ROWS% = 7 ' INTERIOR ROWS IN SCROLL WINDOW.
' IF WINDOW HAS A TITLE BOX ROWS% = NUMBER OF
' WINDOW ROWS - 4 ELSE ROWS% = NUMBER OF WINDOW
' ROWS - 2.
DIM A$(ROWS%) ' DIMENSION ARRAY TO HOLD SCROLL WINDOW ENTRIES.
FC% = 1 ' THE FIRST CHARACTER FOR ENTRIES IN SCROLL WINDOW
' PRINTS IN THE FIRST COLUMN IN THE WINDOW.
' WITH VIRTUAL SCROLL WINDOWS THE CHARACTER IN THE
' 1st COLUMN IS NOT ALWAYS THE 1st CHARACTER.
DATAFILE$ = "RANDDATA.DAT" ' DATA FILE
FILENUM% = 1 ' USE FILE NUMBER 1
DIM DUMMY$(0) ' SCROLL WINDOW REQUIRES THIS FOR INFOLINE
TYPE RECORDTYPE ' PLACE YOUR OWN TYPE HERE
MARK AS STRING * 1
NAM AS STRING * 25
ADD1 AS STRING * 30
CITY AS STRING * 25
STATE AS STRING * 10
ZIP AS STRING * 9
END TYPE
DIM RECORD AS RECORDTYPE
RECORDLEN% = LEN(RECORD)
' SCROLL WINDOW'S TITLE
TITLE$ = "NAME ADDRESS CITY STATE ZIP"
' --------------------------------------------------------------------------
' FIND THE NUMBER OF RECORDS IN THE FILE BASED ON THE RECORD LENGTH.
OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
MAXENTRIES = LOF(1) / RECORDLEN%
CLOSE
OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
GETFILE:
GOSUB GETRECORDS
' ---------------------------------------------------------------------------
' PRINT THE INSTRUCTIONS AND PLACE THE RECORDS IN THE SCROLL WINDOW.
MAKESCRL:
IF ENTRIES% < 1 THEN CALL PRINTW("No entries..", 1, 100): END
CALL NEWCOLOR(15)
CALL PRINTW("[ <ENTER>=Select <F1>=Find <+>=Mark <->=Unmark <ESC>=Quit ]", 8, 100)
CALL NEWCOLOR(COL%)
' KIND$ REPRESENTS TYPE OF SCROLL WINDOW ON ENTRY AND THE MARKED ENTRIES
' ON EXIT.
' SET KIND$ TO "M" TO MAKE A "MARKED" SCROLL WINDOW.
CALL INFOFIXED(" Up/Down/Left/Right -- Pgup/Pgdn -- Home/End -- Tab/Shift Tab -- Mouse")
KIND$ = "M" ' THIS IS A "MARK" SCROLL WINDOW.
CALL B4SCRL("1REX", SCROLLMARK$) ' SET EXIT CRITERIA AND MARKED ENTRIES.
' ENTER THE SCROLL WINDOW
CALL SCRLWIND(A$(), DUMMY$(), TITLE$, ENTRIES%, KIND$, RTRN%, LI%, FC%, RK%, 0)
CALL INFOFIXED("") ' ERASE THE FIXED INFO STRING.
'----------------------------------------------------------------------------
' RK% = 50 IF THE + OR INSERT (MARK) KEY CAUSED THE EXIT.
' RK% = 55 IF THE - OR DELETE (UN-MARK) KEY CAUSED THE EXIT.
' KIND$ HOLDS THE CODED STRING FOR MARKED ITEMS ON EXIT.
' SET SCROLLMARK$ TO KIND$ FOR NEXT ENTRY INTO SCROLL WINDOW.
' NOTE: REQUIRES A FIELD IN THE DATABASE RESERVED FOR THE MARK FLAG.
SELECT CASE RK%
'( KIND$ RETURNED BY SCRLWIND -- REPRESENTS MARKED ITEMS )
CASE 50, 55 '+/INSERT FOR MARK OR -/DELETE FOR UNMARK CAUSED EXIT
IF ONLAST% = 1 THEN ' MOVE FILEPOINTER TO
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN SCROLL
ONLAST% = 0 ' WINDOW.
END IF
IF KIND$ = "" THEN 'NOTHING MARKED
RECORD.MARK = " ": SCROLLMARK$ = SPACE$(ENTRIES%)
ELSE ' AT LEAST ONE ENTRY MARKED
RECORD.MARK = MID$(KIND$, RTRN%, 1): SCROLLMARK$ = KIND$
END IF
PUT 1, FILEPOINTER + RTRN% - 1, RECORD.MARK ' PUT MARK FLAG IN CORRECT
' RECORD IN FILE.
RTRN% = RTRN% + 1 ' ADVANCE TO NEXT RECORD.
IF RTRN > ENTRIES% THEN RK% = 19: GOTO DOWN ' ELSE ACT LIKE DOWN ARROW
'---------------------------------------------------------------------------
' THE ESC KEY CAUSED THE EXIT FROM THE SCROLL WINDOW
CASE 27
CALL PRINTW(STRING$(66, 196), 8, 100)
CALL PRINTINFO(" Press Y to quit or N to continue. Press ENTER to accept..")
ANS$ = "N"
CALL GETANS("Quit (Y/N) ", "YN", ANS$, 14, 100, 1112, 11)
IF ANS$ = "Y" THEN CLOSE : CLS : END
'---------------------------------------------------------------------------
' THE ENTER KEY CAUSED THE EXIT ---- AN ENTRY WAS SELECTED.
' USING MULTINPT THE RECORD COULB BE EDITED HERE.
CASE 13
IF ONLAST% = 1 THEN ' SET FILE POINTER TO THE
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
ONLAST% = 0
END IF
'( SELECTED RECORD = FILEPOINTER + RTRN% - 1 )
CALL PRINTW(STRING$(66, 196), 8, 100)
CALL PRINTINFO(" Press any key to continue.......... ")
CALL GETANS("Selection was record number:" + STR$(FILEPOINTER + RTRN% - 1), "", "", 14, 100, 15, 11)
'---------------------------------------------------------------------------
' THE HOME KEY CAUSED THE EXIT
CASE 30
FC% = 1 ' START WITH 1ST CHARACTER IN 1ST COLUMN
FILEPOINTER = 1 ' START AT RECORD 1
RTRN% = 1 ' SCROLL BAR ON 1ST RECORD IN SCROLL WINDOW.
GOSUB GETRECORDS ' FILL A$() WITH THE RECORDS
'---------------------------------------------------------------------------
' THE END KEY CAUSED THE EXIT
CASE 35
FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' LAST "ROWS%" OF RECORDS
IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' ADJUST IF < 1
GOSUB GETRECORDS ' GET RECORDS TO FILL WINDOW
RTRN% = ENTRIES% ' SCROLL BAR ON LAST RECORD
'---------------------------------------------------------------------------
' THE F1 KEY ( FIND ) CAUSED THE EXIT
CASE 1
DO
CALL DOSOUND
RTRN$ = ""
CALL PRINTW(STRING$(66, 196), 8, 100)
CALL PRINTINFO(" Input a record number. Press ENTER to accept or ESC to abort.")
CALL INPTWIND("FIND RECORD NUMBER ( 1 TO" + STR$(MAXENTRIES) + " ): ", "0", 100, 100, 3, 15, "", RTRN$, RKEY%, 11)
REC = VAL(RTRN$)
' CHECK FOR PROPER RANGE FOR INPUT
LOOP WHILE (REC < 1 OR REC > MAXENTRIES) AND RKEY% <> 27
CALL RSTRINPT(1) ' RESTORE INPUT WINDOW.
IF RKEY% = 27 THEN GOTO MAKESCRL ' ESC WAS PRESSED.
GOTREC:
IF ONLAST% = 1 THEN ' FILE POINTER TO
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
ONLAST% = 0
END IF
FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN.
OLDREC = FILEPOINTER ' SAVE THE OLD FILEPOINTER.
FILEPOINTER = REC ' SET FILEPOINTER TO ENTERED
' RECORD.
IF REC <= ROWS% THEN ' RECORD = 1 TO ROWS%
RTRN% = REC ' SCROLL BAR ON ENTERED RECORD
FILEPOINTER = 1 ' 1ST RECORD = 1ST WIND. ENTRY
ELSEIF REC > MAXENTRIES - ROWS% THEN ' RECORD = MAXENTRIES - ROWS%
RTRN% = ROWS% - (MAXENTRIES - REC) ' TO MAXENTRIES.
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END".
ELSEIF REC >= OLDREC AND REC <= OLDREC + ROWS% - 1 THEN
FILEPOINTER = OLDREC ' RECORD IN PRESENT WINDOW
RTRN% = (REC - OLDREC + 1)
ELSE ' RECORD = ALL OTHERS.
RTRN% = 1 ' SCROLL BAR ON 1ST WIND ENTRY.
FILEPOINTER = REC ' ENTRERED RECORD 1ST IN WIND.
END IF
GOSUB GETRECORDS ' GO GET CORRECT RECORDS
' ---------------------------------------------------------------------------
' SCRLWIND EXIT WAS CAUSED BY ATTEMPT TO MOVE PAST THE END OF
' THE SCROLL WINDOW ( A$(ENTRIES%) ). PROGRAM ALSO MOVES HERE IF
' Mark (+) /Un-mark (-) WAS PRESSED ON THE LAST ENTRY IN THE SCROLL
' WINDOW.
CASE 12, 19 ' SCROLLING PAST THE END OF
' LIST IN THE SCROLL WINDOW.
DOWN:
IF ONLAST% = 0 THEN ' IF FILE POINTER IS ON
FILEPOINTER = FILEPOINTER + ENTRIES% - 1 ' FIRST ENTRY IN THE SCROLL
ONLAST% = 1 ' WINDOW MOVE IT TO THE
END IF ' LAST ENTRY.
IF LI% = ENTRIES% AND FILEPOINTER + 1 > MAXENTRIES THEN ' END OF FILE?
RTRN% = ENTRIES%
CALL DOSOUND ' MAKE BEEP AND DO NOTHING
ELSE ' NOT END OF FILE
IF ENTRIES% = ROWS% THEN
FILEPOINTER = FILEPOINTER + 1 ' INCREMENT FILEPOINTER
IF RK% = 12 THEN ' PAGE DOWN
IF FILEPOINTER + ROWS% - 1 > MAXENTRIES THEN ' END OF FILE?
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END"
END IF
GOSUB GETRECORDS ' PUT RECORDS IN A$()
ELSE ' MUST BE DOWN ARROW.
FOR X% = 1 TO ROWS% - 1 ' SHIFT SCROLL ENTRIES
SWAP A$(X%), A$(X% + 1) ' UP ONE.
NEXT
GET 1, FILEPOINTER, RECORD ' GET NEW LAST ENTRY.
A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
'FIX STRING REPRESENTING "MARKED" ENTRIES
SCROLLMARK$ = RIGHT$(SCROLLMARK$, ENTRIES% - 1) + RECORD.MARK
END IF
END IF
END IF
RTRN% = ENTRIES%
'----------------------------------------------------------------------------
' SCRLWIND EXIT WAS CAUSED BY AN ATTEMPT TO MOVE BEFORE THE FIRST
' ENTRY ( A$(START) ) IN THE SCROLL WINDOW.
CASE 11, 16 ' SCROLLING BEFORE START OF
' LIST IN SCROLL WINDOW
IF ONLAST% = 1 THEN ' IF FILEPOINTER = LAST SCROLL
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' WINDOW ENTRY SET TO FIRST.
ONLAST% = 0
END IF
IF LI% = 1 AND FILEPOINTER = 1 THEN ' FIRST RECORD IN FIRST ROW.
CALL DOSOUND ' CAN'T MOVE UP.
ELSE
IF ENTRIES% = ROWS% THEN
IF RK% = 11 THEN ' MUST BE PAGE UP.
FILEPOINTER = FILEPOINTER - ROWS% ' MOVE UP ONE PAGE OF "RECORDS"
IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' BEFORE FIRST RECORD?
GOSUB GETRECORDS ' PUT RECORDS IN A$()
ELSE ' MUST BE UP ARROW.
FILEPOINTER = FILEPOINTER - 1 ' MOVE POINTER UP ONE IN FILE.
FOR X% = ROWS% TO 2 STEP -1 ' SHIFT RECORDS IF SCROLL LIST.
SWAP A$(X%), A$(X% - 1)
NEXT
GET 1, FILEPOINTER, RECORD ' GET A NEW FIRST RECORD
A$(1) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
'FIX STRING REPRESENTING "MARKED" ENTRIES
SCROLLMARK$ = RECORD.MARK + LEFT$(SCROLLMARK$, ENTRIES% - 1)
END IF
END IF
END IF
LIN% = 1: RTRN% = 1
END SELECT
GOTO MAKESCRL
'---------------------------------------------------------------------------
' READ RECORDS FROM THE FILE. READ UNTIL MAXIMUM NUMBER OF ENTRIES
' IN THE SCROLL WINDOWS ( ROWS% ) IS REACHED, OR UNTIL THE END
' OF FILE ( MAXENTRIES% ) IS REACHED.
GETRECORDS:
SCROLLMARK$ = SPACE$(ROWS%) ' MAKE STRING TO REPRESENT "MARKED" ENTRIES.
ENTRIES% = 0 ' ENTRIES IN SCROLL WINDOW.
WHILE ENTRIES% < ROWS% AND FILEPOINTER <= MAXENTRIES
ENTRIES% = ENTRIES% + 1 ' INCREMENT ENTRIES.
GET 1, FILEPOINTER, RECORD ' GET RECORD FROM THE FILE
FILEPOINTER = FILEPOINTER + 1 ' MOVE TO NEXT RECORD
' MAKE AN ENTRY IN THE SCROLL WINDOW
A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
' SET STRING REPRESENTING "MARKED" ENTRIES
MID$(SCROLLMARK$, ENTRIES%, 1) = RECORD.MARK
WEND
FILEPOINTER = FILEPOINTER - 1 ' ADJUST TO LAST RECORD IN SCROLL WINDOW.
ONLAST% = 1 ' SET FLAG TO SHOW FILE POINTER IS
' ON LAST RECORD IN SCROLL WINDOW.
SCROLLMARK$ = LEFT$(SCROLLMARK$, ENTRIES%) ' MAKE IT THE CORRECT LENGTH
' REQUIRED WHEN ENTRIES% < ROWS%
RETURN
'----------------------------------------------------------------------------